/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.camachosanchez.gui;

import com.camachosanchez.bean.*;
import com.camachosanchez.controler.jdbc.ControlCambioNeumaticoJdbcControler;
import com.camachosanchez.controler.jpa.PilotosJpaController;
import com.camachosanchez.controler.jpa.VehiculosJpaController;
import com.camachosanchez.gui.table.RenderizadorTablaEntrada;
import com.camachosanchez.gui.table.RenderizadorTablaSalida;
import com.camachosanchez.mechanics.EjeES;
import com.camachosanchez.mechanics.LlantaES;
import com.camachosanchez.util.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

/**
 *
 * @author Zully
 */
public class EntradaSalida extends javax.swing.JDialog implements MouseListener {

    private EntityManagerFactory emf = null;
    public EstadosJDialog.EstadoJDialog Estado;
    private Vehiculos vehiculo;
    private InspeccionEquipo inspeccionSalida;
    private DefaultTableModel dmSalida;
    private DefaultTableModel dmEntrada;
    private ControlCambioNeumatico controlActual;
    private LienzoModelo lienzoSalida;
    private LienzoModelo lienzoEntrada;
    private Image imagen;
    private int img_x;
    private int img_y;
    private List<LlantaES> llantas_finales;
    private List<EjeES> ejes;
    private int tipo_vehiculo;
    private Point centro;
    private List<DetalleInspeccionEquipo> detalleSalida;
    private List<DetalleInspeccionEquipo> detalleEntrada;
    private List<DetalleInspeccionEquipo> detalleInspeccionSalida;
    private Formatter fmt;
    private RenderizadorTablaSalida renderSalida;
    private RenderizadorTablaEntrada renderEntrada;
    private JTextField txtComentarioSalida;
    private JTextField txtComentarioEntrada;
    private boolean es;

    /**
     * Creates new form testCambioModelo
     */
    public EntradaSalida(java.awt.Frame parent, boolean modal, Vehiculos vehiculo, InspeccionEquipo inspeccionSalida, final boolean es) {
        super(parent, modal);
        initComponents();
        txtComentarioSalida = new JTextField();
        txtComentarioEntrada = new JTextField();
        this.emf = JPAUtil.getEntityManagerFactory();
        this.es = es;
        fmt = new Formatter();

        lienzoSalida = new LienzoModelo();
        lienzoSalida.revalidate();
        lienzoEntrada = new LienzoModelo();
        lienzoEntrada.revalidate();
        contenedorSalida.add(lienzoSalida, BorderLayout.CENTER);
        contenedorEntrada.add(lienzoEntrada, BorderLayout.CENTER);
        detalleSalida = new ArrayList<DetalleInspeccionEquipo>();
        detalleEntrada = new ArrayList<DetalleInspeccionEquipo>();

        this.setLocationRelativeTo(null);
        spnHoraSalida.setModel(new SpinnerDateModel());
        JSpinner.DateEditor timeEditorS = new JSpinner.DateEditor(spnHoraSalida, "hh:mm a");
        spnHoraSalida.setEditor(timeEditorS);
        spnHoraSalida.setValue(new Date());

        spnHoraEntrada.setModel(new SpinnerDateModel());
        JSpinner.DateEditor timeEditorE = new JSpinner.DateEditor(spnHoraEntrada, "hh:mm a");
        spnHoraEntrada.setEditor(timeEditorE);
        spnHoraEntrada.setValue(new Date());

        this.inspeccionSalida = inspeccionSalida;
        if (inspeccionSalida == null) {
            int sgteIdInspeccion = SQLUtil.obtenerMaximoIdInspeccion() + 1;
            this.txtId.setText("" + fmt.format("%07d", sgteIdInspeccion));
            this.vehiculo = vehiculo;
        } else {
            this.txtId.setText("" + fmt.format("%07d", inspeccionSalida.getId()));
            VehiculosJpaController dao_vehiculo = new VehiculosJpaController(null);
            this.vehiculo = dao_vehiculo.findVehiculos(inspeccionSalida.getIdVehiculoSalida().getId());
        }

        this.llantas_finales = new ArrayList<LlantaES>();
        this.imagen = null;
        this.tipo_vehiculo = 0;
        this.inicializarImagenes();

        this.llenarListasDesplegables();
        Pilotos pilotoS = (Pilotos) this.comboPilotoSalida.getSelectedItem();
        this.txtLicenciaSalida.setText(pilotoS.getTipoLicencia());
        Pilotos pilotoE = (Pilotos) this.comboPilotoEntrada.getSelectedItem();
        this.txtLicenciaEntrada.setText(pilotoE.getTipoLicencia());

        dmSalida = new DefaultTableModel() {

            @Override
            public boolean isCellEditable(int row, int col) {
                return col == 2;
            }

            @Override
            public Class getColumnClass(int c) {
                return String.class;
            }
        };
        Object[] columns = new Object[]{"POS", "NEUMÁTICO", "OBSERVACIÓN"};
        dmSalida.setColumnIdentifiers(columns);
        tablaSalida.setModel(dmSalida);
        tablaSalida.setFillsViewportHeight(true);
        this.dateFechaSalida.setDate(new Date());
        this.dateFechaEntrada.setDate(new Date());

        dmEntrada = new DefaultTableModel() {

            @Override
            public boolean isCellEditable(int row, int col) {
                return col == 0 || col == 3;
            }

            @Override
            public Class getColumnClass(int c) {
                if (c == 0) {
                    return Boolean.class;
                }
                return String.class;
            }
        };
        Object[] columns1 = new Object[]{"*", "POS", "NEUMÁTICO", "OBSERVACIÓN"};
        dmEntrada.setColumnIdentifiers(columns1);
        tablaEntrada.setModel(dmEntrada);
        tablaEntrada.setFillsViewportHeight(true);
        this.txtVehiculoSalida.setText(vehiculo.getPlaca());
        this.txtVehiculoEntrada.setText(vehiculo.getPlaca());
        this.txtId.setVisible(false);

        renderSalida = new RenderizadorTablaSalida();
        renderEntrada = new RenderizadorTablaEntrada();
        tablaSalida.setDefaultRenderer(Object.class, renderSalida);
        tablaEntrada.setDefaultRenderer(Object.class, renderEntrada);

        tablaEntrada.getTableHeader().setReorderingAllowed(false);
        tablaSalida.getTableHeader().setReorderingAllowed(false);

        DefaultTableCellRenderer rendererEntrada = (DefaultTableCellRenderer) tablaEntrada.getTableHeader().getDefaultRenderer();
        rendererEntrada.setHorizontalAlignment(JLabel.CENTER);
        DefaultTableCellRenderer rendererSalida = (DefaultTableCellRenderer) tablaSalida.getTableHeader().getDefaultRenderer();
        rendererSalida.setHorizontalAlignment(JLabel.CENTER);
        establecerEventosTeclas();
        pack();
        GUIUtil.SetAnchoColumnas(tablaEntrada);
        GUIUtil.SetAnchoColumnas(tablaSalida);
    }

    private void establecerEventosTeclas() {
        TableColumn columnaCodigoSalida = tablaSalida.getColumnModel().getColumn(2);
        txtComentarioSalida.addMouseListener(this);
        txtComentarioSalida.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 4, 1, 1));
        txtComentarioSalida.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        DefaultCellEditor singleclickCodigoSalida = new DefaultCellEditor(txtComentarioSalida);
        singleclickCodigoSalida.setClickCountToStart(1);
        columnaCodigoSalida.setCellEditor(singleclickCodigoSalida);
        
        TableColumn columnaCodigoEntrada = tablaEntrada.getColumnModel().getColumn(3);
        txtComentarioEntrada.addMouseListener(this);
        txtComentarioEntrada.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 4, 1, 1));
        txtComentarioEntrada.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        DefaultCellEditor singleclickCodigoEntrada = new DefaultCellEditor(txtComentarioEntrada);
        singleclickCodigoEntrada.setClickCountToStart(1);
        columnaCodigoEntrada.setCellEditor(singleclickCodigoEntrada);
    }

    private boolean inicializarParaSalida() {
        //para a salida se lee del último control de cambio que se hizo
        this.dateFechaEntrada.setDate(null);
        this.comboPilotoEntrada.setSelectedIndex(-1);
        ControlCambioNeumaticoJdbcControler daoJdbc = new ControlCambioNeumaticoJdbcControler();
        List<DetalleControlCambioNeumatico> detalles = daoJdbc.findUltimoDetalleControlCambio(vehiculo.getId());
        if (detalles.isEmpty()) {
            return false;//si no hay neumáticos montados en el vehículo
        } else {
            controlActual = new ControlCambioNeumatico();
            controlActual.setDetalleControlCambioNeumaticoList(detalles);
            for (DetalleControlCambioNeumatico item : detalles) {
                if (item.getTipo() >= 0) {
                    DetalleInspeccionEquipo detalleInsp = new DetalleInspeccionEquipo();
                    detalleInsp.setIdNeumatico(item.getIdNeumatico());
                    detalleInsp.setPosicion(item.getPosicion());
                    detalleInsp.setObservacion("");

                    Object[] filaE = new Object[3];
                    if (detalleInsp.getPosicion() <= 0) {
                        filaE[0] = "R";
                    } else {
                        filaE[0] = detalleInsp.getPosicion();
                    }
                    filaE[1] = detalleInsp.getIdNeumatico().getCodigo();
                    filaE[2] = detalleInsp.getObservacion();
                    dmSalida.addRow(filaE);

                    this.detalleSalida.add(detalleInsp);
                }
            }
            return true;
        }
    }

    private void inicializarParaEntrada() {
        //para a entrada se lee de la inspección de salida que se hizo
        detalleInspeccionSalida = SQLUtil.obtenerDetalleInspeccionSalida(this.inspeccionSalida.getId());
        this.dateFechaSalida.setDate(this.inspeccionSalida.getFechaHoraSalida());
        this.spnHoraSalida.setValue(this.inspeccionSalida.getFechaHoraSalida());
        this.txtClienteSalida.setText(this.inspeccionSalida.getClienteSalida());
        this.txtTranspSalida.setText(this.inspeccionSalida.getTransportistaSalida());
        this.comboPilotoSalida.setSelectedItem(this.inspeccionSalida.getIdPilotoSalida());
        this.checkDaniado.setSelected(this.inspeccionSalida.getDaniado());
        this.checkOperable.setSelected(this.inspeccionSalida.getOperable());
        this.checkReqMant.setSelected(this.inspeccionSalida.getReqMantenimiento());
        this.checkReqPrep.setSelected(this.inspeccionSalida.getReqPreparacion());

        for (DetalleInspeccionEquipo detalle : detalleInspeccionSalida) {
            DetalleInspeccionEquipo detalleInsp = new DetalleInspeccionEquipo();
            detalleInsp.setIdNeumatico(detalle.getIdNeumatico());
            detalleInsp.setPosicion(detalle.getPosicion());
            detalleInsp.setObservacion(detalle.getObservacion());

            Object[] filaS = new Object[3];
            if (detalleInsp.getPosicion() <= 0) {
                filaS[0] = "R";
            } else {
                filaS[0] = detalleInsp.getPosicion();
            }
//            filaS[0] = detalleInsp.getPosicion();
            filaS[1] = detalleInsp.getIdNeumatico().getCodigo();
            filaS[2] = detalleInsp.getObservacion();
            dmSalida.addRow(filaS);

            Object[] filaE = new Object[4];
            filaE[0] = Boolean.TRUE;
            if (detalleInsp.getPosicion() <= 0) {
                filaE[1] = "R";
            } else {
                filaE[1] = detalleInsp.getPosicion();
            }
            filaE[2] = detalleInsp.getIdNeumatico().getCodigo();
            filaE[3] = "";
            dmEntrada.addRow(filaE);
            this.detalleEntrada.add(detalleInsp);
        }
    }

//    private List<DetalleControlCambioNeumatico> OrdenarXPosicion(List<DetalleControlCambioNeumatico> lista) {
//        int tamanio = lista.size();
//        DetalleControlCambioNeumatico aux;
//        for (int i = 1; i < tamanio; i++) {
//            for (int j = 0; j < tamanio - i; j++) {
//                if (lista.get(j).getPosicion() > lista.get(j + 1).getPosicion()) {
//                    aux = lista.get(j);
//                    lista.set(j, lista.get(j + 1));
//                    lista.set(j + 1, aux);
//                }
//            }
//        }
//        return lista;
//    }
    private void llenarListasDesplegables() {
        PilotosJpaController dao_piloto = new PilotosJpaController(null);
        List<Pilotos> pilotos = dao_piloto.findPilotosEntities();
        if (pilotos.isEmpty()) {
            JOptionPane.showMessageDialog(this, "Se necesita por lo menos un piloto registrado para realizar una salida, ingréselo desde el menú Logística.", "Datos incompletos", JOptionPane.WARNING_MESSAGE);
            return;
        }
        comboPilotoSalida.setModel(new DefaultComboBoxModel(pilotos.toArray()));
        comboPilotoEntrada.setModel(new DefaultComboBoxModel(pilotos.toArray()));
    }

    private void inicializarImagenes() {
        if (vehiculo != null) {
            if (vehiculo.getIdTipo().getId() == Constantes.REMOLQUE) {
                imagen = (new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/cabezal-b.png"))).getImage();
                tipo_vehiculo = Constantes.REMOLQUE;
            } else if (vehiculo.getIdTipo().getId() == Constantes.SEMIREMOLQUE) {
                imagen = (new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/chasis-b.png"))).getImage();
                tipo_vehiculo = Constantes.SEMIREMOLQUE;
            } else if (vehiculo.getIdTipo().getId() == Constantes.FURGON) {
                imagen = (new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/bus-b.png"))).getImage();
                tipo_vehiculo = Constantes.FURGON;
            }
        }
    }

    private boolean validarDatosSalida() {
        try {
            String formato = dateFechaSalida.getDateFormatString();
            Date date = dateFechaSalida.getDate();
            SimpleDateFormat sdf = new SimpleDateFormat(formato);
            String format = sdf.format(date);
        } catch (NullPointerException ex) {
            JOptionPane.showMessageDialog(this, "Seleccione una fecha de salida válida.", "Error", JOptionPane.ERROR_MESSAGE);
            dateFechaSalida.requestFocusInWindow();
            return false;
        }
        return true;
    }

    private boolean validarDatosEntrada() {
        try {
            String formato = dateFechaEntrada.getDateFormatString();
            Date date = dateFechaEntrada.getDate();
            SimpleDateFormat sdf = new SimpleDateFormat(formato);
            String format = sdf.format(date);
        } catch (NullPointerException ex) {
            JOptionPane.showMessageDialog(this, "Seleccione una fecha de entrada válida.", "Error", JOptionPane.ERROR_MESSAGE);
            dateFechaEntrada.requestFocusInWindow();
            return false;
        }
        return true;
    }

    public boolean inicializarForm() {
        if (this.inspeccionSalida == null) {//nuevo registro de salida
            this.deshabilitarEntrada();
            return this.inicializarParaSalida();
        } else {//registro de entrada de unidad
            this.deshabilitarSalida();
            this.inicializarParaEntrada();
        }
        GUIUtil.SetAnchoColumnas(tablaSalida);
        GUIUtil.SetAnchoColumnas(tablaEntrada);
        return true;
    }

    private void deshabilitarEntrada() {
        this.dateFechaEntrada.setEnabled(false);
        this.spnHoraEntrada.setEnabled(false);
        this.txtClienteEntrada.setEditable(false);
        this.txtTranspEntrada.setEnabled(false);
        this.comboPilotoEntrada.setEnabled(false);
        this.txtVehiculoEntrada.setEnabled(false);
        this.tablaEntrada.setEnabled(false);
    }

    private void deshabilitarSalida() {
        this.dateFechaSalida.setEnabled(false);
        this.spnHoraSalida.setEnabled(false);
        this.txtClienteSalida.setEditable(false);
        this.txtTranspSalida.setEnabled(false);
        this.comboPilotoSalida.setEnabled(false);
        this.tablaSalida.setEnabled(false);
        this.checkOperable.setEnabled(false);
        this.checkReqPrep.setEnabled(false);
        this.checkReqMant.setEnabled(false);
        this.checkDaniado.setEnabled(false);
    }

    private void guardarDatos() {
        if (this.inspeccionSalida == null) {//nuevo registro de salida
            if (this.validarDatosSalida()) {
                this.registrarSalida();
            }
        } else {//registro de entrada de unidad
            if (this.validarDatosEntrada()) {
                this.registrarEntrada();
            }
        }
    }

    private void registrarSalida() {
        if (tablaSalida.getCellEditor() != null) {
            tablaSalida.getCellEditor().stopCellEditing();
        }
        EntityManager em = null;
        try {
            em = emf.createEntityManager();
            EntityTransaction tx = em.getTransaction();
            tx.begin();
            Calendar cal = Calendar.getInstance();
            cal.setTime(dateFechaSalida.getDate());
            Date dS = (Date) spnHoraSalida.getValue();
            Calendar c = Calendar.getInstance();
            c.setTime(dS);
            cal.set(Calendar.HOUR, c.get(Calendar.HOUR));
            cal.set(Calendar.MINUTE, c.get(Calendar.MINUTE));
            cal.set(Calendar.SECOND, 0);
            cal.set(Calendar.MILLISECOND, 0);
            cal.set(Calendar.AM_PM, c.get(Calendar.AM_PM));
            Date fehaS = cal.getTime();

            InspeccionEquipo inspeccion = new InspeccionEquipo();
            inspeccion.setId(Integer.parseInt(this.txtId.getText()));
            inspeccion.setFechaHoraSalida(fehaS);
            inspeccion.setClienteSalida(this.txtClienteSalida.getText().trim());
            inspeccion.setTransportistaSalida(this.txtTranspSalida.getText().trim());
            inspeccion.setIdPilotoSalida((Pilotos) this.comboPilotoSalida.getSelectedItem());
            inspeccion.setIdVehiculoSalida(this.vehiculo);
            inspeccion.setOperable(this.checkOperable.isSelected());
            inspeccion.setReqMantenimiento(this.checkReqMant.isSelected());
            inspeccion.setReqPreparacion(this.checkReqPrep.isSelected());
            inspeccion.setDaniado(this.checkDaniado.isSelected());
            inspeccion.setIdUsuarioSalida(Constantes.currentUser);
            inspeccion.setFechaInsercionActualizacion(new Date());

            List<DetalleInspeccionEquipo> detalle = new ArrayList<DetalleInspeccionEquipo>();
            //****************Guardar detalle****************
            int i = 0;
            for (DetalleInspeccionEquipo item : detalleSalida) {
                item.setIdInspeccionEquipo(inspeccion);
                item.setObservacion(dmSalida.getValueAt(i, 2).toString());
                item.setFechaInsercionActualizacion(new Date());
                item.setTipo(false);//salida
                item.setEstado(true);
                detalle.add(item);
                i++;
            }

            inspeccion.setDetalleInspeccionEquipoList(detalle);
            em.persist(inspeccion);
            tx.commit();
            JOptionPane.showMessageDialog(this, "El registro ha sido guardado correctamente.", "Operación finalizada", JOptionPane.INFORMATION_MESSAGE);
            this.dispose();
        } catch (Exception e) {
            if (em.getTransaction().isActive()) {
                em.getTransaction().rollback();
            }
            e.printStackTrace();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    private void registrarEntrada() {
        if (tablaEntrada.getCellEditor() != null) {
            tablaEntrada.getCellEditor().stopCellEditing();
        }
        EntityManager em = null;
        try {
            em = emf.createEntityManager();
            EntityTransaction tx = em.getTransaction();
            tx.begin();
            Calendar cal = Calendar.getInstance();
            cal.setTime(dateFechaEntrada.getDate());
            Date dE = (Date) spnHoraEntrada.getValue();
            Calendar c = Calendar.getInstance();
            c.setTime(dE);
            cal.set(Calendar.HOUR, c.get(Calendar.HOUR));
            cal.set(Calendar.MINUTE, c.get(Calendar.MINUTE));
            cal.set(Calendar.SECOND, 0);
            cal.set(Calendar.MILLISECOND, 0);
            cal.set(Calendar.AM_PM, c.get(Calendar.AM_PM));
            Date fechaE = cal.getTime();

            int id = Integer.parseInt(this.txtId.getText());
            InspeccionEquipo inspeccion = (InspeccionEquipo) em.getReference(InspeccionEquipo.class, id);
            inspeccion.setFechaHoraEntrada(fechaE);
            inspeccion.setClienteEntrada(this.txtClienteEntrada.getText().trim());
            inspeccion.setTransportistaEntrada(this.txtTranspEntrada.getText().trim());
            inspeccion.setIdPilotoEntrada((Pilotos) this.comboPilotoEntrada.getSelectedItem());
            inspeccion.setIdVehiculoEntrada(this.vehiculo);
            inspeccion.setIdUsuarioEntrada(Constantes.currentUser);
            inspeccion.setFechaInsercionActualizacion(new Date());
            inspeccion.setEstadoTransaccion(true);//entrada registrada, operación finalizada

            List<DetalleInspeccionEquipo> detalle = new ArrayList<DetalleInspeccionEquipo>();

            //****************Guardar detalle****************
            int i = 0;
            for (DetalleInspeccionEquipo item : detalleEntrada) {
                item.setIdInspeccionEquipo(inspeccion);
                item.setObservacion(dmEntrada.getValueAt(i, 3).toString());
                item.setEstado(Boolean.parseBoolean(dmEntrada.getValueAt(i, 0).toString()));
                item.setFechaInsercionActualizacion(new Date());
                item.setTipo(true);//entrada
                detalle.add(item);
                i++;
            }
            inspeccion.setDetalleInspeccionEquipoList(detalle);
            em.persist(inspeccion);
            tx.commit();
            JOptionPane.showMessageDialog(this, "El registro ha sido guardado correctamente.", "Operación finalizada", JOptionPane.INFORMATION_MESSAGE);
            this.dispose();
        } catch (Exception e) {
            if (em.getTransaction().isActive()) {
                em.getTransaction().rollback();
            }
            e.printStackTrace();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        pnlContenedor = new javax.swing.JPanel();
        jToolBar1 = new javax.swing.JToolBar();
        jPanel5 = new javax.swing.JPanel();
        btnGuardar = new javax.swing.JButton();
        txtId = new javax.swing.JTextField();
        jPanel10 = new javax.swing.JPanel();
        jPanel9 = new javax.swing.JPanel();
        jPanel19 = new javax.swing.JPanel();
        jPanel1 = new javax.swing.JPanel();
        jLabel20 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jPanel3 = new javax.swing.JPanel();
        txtVehiculoSalida = new javax.swing.JTextField();
        jPanel4 = new javax.swing.JPanel();
        dateFechaSalida = new com.toedter.calendar.JDateChooser();
        spnHoraSalida = new javax.swing.JSpinner();
        txtClienteSalida = new javax.swing.JTextField();
        txtTranspSalida = new javax.swing.JTextField();
        comboPilotoSalida = new javax.swing.JComboBox();
        txtLicenciaSalida = new javax.swing.JTextField();
        jPanel20 = new javax.swing.JPanel();
        jPanel6 = new javax.swing.JPanel();
        jLabel21 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        jLabel9 = new javax.swing.JLabel();
        jLabel10 = new javax.swing.JLabel();
        jLabel11 = new javax.swing.JLabel();
        jLabel12 = new javax.swing.JLabel();
        jPanel7 = new javax.swing.JPanel();
        txtVehiculoEntrada = new javax.swing.JTextField();
        jPanel12 = new javax.swing.JPanel();
        dateFechaEntrada = new com.toedter.calendar.JDateChooser();
        spnHoraEntrada = new javax.swing.JSpinner();
        txtClienteEntrada = new javax.swing.JTextField();
        txtTranspEntrada = new javax.swing.JTextField();
        comboPilotoEntrada = new javax.swing.JComboBox();
        txtLicenciaEntrada = new javax.swing.JTextField();
        jPanel2 = new javax.swing.JPanel();
        jPanel15 = new javax.swing.JPanel();
        contenedorSalida = new javax.swing.JPanel();
        jPanel16 = new javax.swing.JPanel();
        contenedorEntrada = new javax.swing.JPanel();
        jPanel8 = new javax.swing.JPanel();
        jPanel13 = new javax.swing.JPanel();
        scrollBuses2 = new javax.swing.JScrollPane();
        tablaSalida = new javax.swing.JTable();
        jPanel14 = new javax.swing.JPanel();
        scrollBuses3 = new javax.swing.JScrollPane();
        tablaEntrada = new javax.swing.JTable();
        jPanel11 = new javax.swing.JPanel();
        checkOperable = new javax.swing.JCheckBox();
        checkReqMant = new javax.swing.JCheckBox();
        checkReqPrep = new javax.swing.JCheckBox();
        checkDaniado = new javax.swing.JCheckBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle(".:: Inspección de Entrada/Salida ::.");
        setResizable(false);

        pnlContenedor.setLayout(new java.awt.BorderLayout());

        jToolBar1.setFloatable(false);
        jToolBar1.setRollover(true);
        jToolBar1.setOpaque(false);

        jPanel5.setBackground(new java.awt.Color(255, 255, 255));
        jPanel5.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));

        btnGuardar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/camachosanchez/recursos/24_save.png"))); // NOI18N
        btnGuardar.setToolTipText("Guardar");
        btnGuardar.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        btnGuardar.setFocusable(false);
        btnGuardar.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
        btnGuardar.setMaximumSize(new java.awt.Dimension(22, 22));
        btnGuardar.setMinimumSize(new java.awt.Dimension(22, 22));
        btnGuardar.setPreferredSize(new java.awt.Dimension(22, 22));
        btnGuardar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btnGuardar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnGuardarActionPerformed(evt);
            }
        });
        jPanel5.add(btnGuardar);

        txtId.setEditable(false);
        txtId.setFont(new java.awt.Font("Arial Rounded MT Bold", 1, 5));
        txtId.setHorizontalAlignment(javax.swing.JTextField.RIGHT);
        txtId.setText("0");
        jPanel5.add(txtId);

        jToolBar1.add(jPanel5);

        pnlContenedor.add(jToolBar1, java.awt.BorderLayout.PAGE_START);

        jPanel9.setOpaque(false);
        jPanel9.setLayout(new java.awt.GridLayout(1, 2, 3, 0));

        jPanel19.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Salida", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N
        jPanel19.setOpaque(false);
        jPanel19.setLayout(new java.awt.BorderLayout());

        jPanel1.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 4));
        jPanel1.setOpaque(false);
        jPanel1.setLayout(new java.awt.GridLayout(6, 1, 2, 2));

        jLabel20.setText("Vehículo / Placa:");
        jPanel1.add(jLabel20);

        jLabel7.setText("Fecha / Hora:");
        jPanel1.add(jLabel7);

        jLabel3.setText("Cliente:");
        jPanel1.add(jLabel3);

        jLabel4.setText("Transportista:");
        jPanel1.add(jLabel4);

        jLabel6.setText("Piloto:");
        jPanel1.add(jLabel6);

        jLabel5.setText("Licencia:");
        jPanel1.add(jLabel5);

        jPanel19.add(jPanel1, java.awt.BorderLayout.LINE_START);

        jPanel3.setOpaque(false);
        jPanel3.setLayout(new java.awt.GridLayout(6, 1, 2, 2));

        txtVehiculoSalida.setEditable(false);
        jPanel3.add(txtVehiculoSalida);

        jPanel4.setOpaque(false);
        jPanel4.setLayout(new java.awt.GridLayout(1, 2, 2, 0));

        dateFechaSalida.setDateFormatString("dd/MM/yyyy");
        jPanel4.add(dateFechaSalida);
        jPanel4.add(spnHoraSalida);

        jPanel3.add(jPanel4);

        txtClienteSalida.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txtClienteSalidaKeyPressed(evt);
            }
        });
        jPanel3.add(txtClienteSalida);

        txtTranspSalida.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txtTranspSalidaKeyPressed(evt);
            }
        });
        jPanel3.add(txtTranspSalida);

        comboPilotoSalida.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        comboPilotoSalida.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                comboPilotoSalidaItemStateChanged(evt);
            }
        });
        jPanel3.add(comboPilotoSalida);

        txtLicenciaSalida.setEditable(false);
        txtLicenciaSalida.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txtLicenciaSalidaKeyPressed(evt);
            }
        });
        jPanel3.add(txtLicenciaSalida);

        jPanel19.add(jPanel3, java.awt.BorderLayout.CENTER);

        jPanel9.add(jPanel19);

        jPanel20.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Entrada", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N
        jPanel20.setOpaque(false);
        jPanel20.setLayout(new java.awt.BorderLayout());

        jPanel6.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 4));
        jPanel6.setOpaque(false);
        jPanel6.setLayout(new java.awt.GridLayout(6, 1, 2, 2));

        jLabel21.setText("Vehículo / Placa:");
        jPanel6.add(jLabel21);

        jLabel8.setText("Fecha / Horra:");
        jPanel6.add(jLabel8);

        jLabel9.setText("Cliente:");
        jPanel6.add(jLabel9);

        jLabel10.setText("Transportista:");
        jPanel6.add(jLabel10);

        jLabel11.setText("Piloto:");
        jPanel6.add(jLabel11);

        jLabel12.setText("Licencia:");
        jPanel6.add(jLabel12);

        jPanel20.add(jPanel6, java.awt.BorderLayout.LINE_START);

        jPanel7.setOpaque(false);
        jPanel7.setLayout(new java.awt.GridLayout(6, 1, 2, 2));

        txtVehiculoEntrada.setEditable(false);
        jPanel7.add(txtVehiculoEntrada);

        jPanel12.setOpaque(false);
        jPanel12.setLayout(new java.awt.GridLayout(1, 2, 2, 2));

        dateFechaEntrada.setDateFormatString("dd/MM/yyyy");
        jPanel12.add(dateFechaEntrada);
        jPanel12.add(spnHoraEntrada);

        jPanel7.add(jPanel12);

        txtClienteEntrada.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txtClienteEntradaKeyPressed(evt);
            }
        });
        jPanel7.add(txtClienteEntrada);

        txtTranspEntrada.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txtTranspEntradaKeyPressed(evt);
            }
        });
        jPanel7.add(txtTranspEntrada);

        comboPilotoEntrada.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        comboPilotoEntrada.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                comboPilotoEntradaItemStateChanged(evt);
            }
        });
        jPanel7.add(comboPilotoEntrada);

        txtLicenciaEntrada.setEditable(false);
        txtLicenciaEntrada.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txtLicenciaEntradaKeyPressed(evt);
            }
        });
        jPanel7.add(txtLicenciaEntrada);

        jPanel20.add(jPanel7, java.awt.BorderLayout.CENTER);

        jPanel9.add(jPanel20);

        jPanel2.setOpaque(false);
        jPanel2.setLayout(new java.awt.GridLayout(1, 2, 10, 0));

        jPanel15.setBackground(new java.awt.Color(255, 255, 255));
        jPanel15.setMinimumSize(new java.awt.Dimension(419, 133));
        jPanel15.setLayout(new java.awt.BorderLayout());

        contenedorSalida.setBackground(new java.awt.Color(255, 255, 255));
        contenedorSalida.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(204, 204, 204)));
        contenedorSalida.setLayout(new java.awt.BorderLayout());
        jPanel15.add(contenedorSalida, java.awt.BorderLayout.CENTER);

        jPanel2.add(jPanel15);

        jPanel16.setBackground(new java.awt.Color(255, 255, 255));
        jPanel16.setMinimumSize(new java.awt.Dimension(419, 133));
        jPanel16.setLayout(new java.awt.BorderLayout());

        contenedorEntrada.setBackground(new java.awt.Color(255, 255, 255));
        contenedorEntrada.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(204, 204, 204)));
        contenedorEntrada.setLayout(new java.awt.BorderLayout());
        jPanel16.add(contenedorEntrada, java.awt.BorderLayout.CENTER);

        jPanel2.add(jPanel16);

        jPanel8.setOpaque(false);
        jPanel8.setLayout(new java.awt.GridLayout(1, 0, 5, 0));

        jPanel13.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Neumáticos de salida", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N
        jPanel13.setOpaque(false);
        jPanel13.setLayout(new java.awt.BorderLayout());

        tablaSalida.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        tablaSalida.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        tablaSalida.setRowHeight(18);
        tablaSalida.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        scrollBuses2.setViewportView(tablaSalida);

        jPanel13.add(scrollBuses2, java.awt.BorderLayout.CENTER);

        jPanel8.add(jPanel13);

        jPanel14.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Neumáticos de entrada", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 12))); // NOI18N
        jPanel14.setOpaque(false);
        jPanel14.setLayout(new java.awt.BorderLayout());

        tablaEntrada.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        tablaEntrada.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        tablaEntrada.setRowHeight(18);
        tablaEntrada.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        scrollBuses3.setViewportView(tablaEntrada);

        jPanel14.add(scrollBuses3, java.awt.BorderLayout.CENTER);

        jPanel8.add(jPanel14);

        jPanel11.setBorder(javax.swing.BorderFactory.createTitledBorder("Condiciones Generales"));
        jPanel11.setOpaque(false);
        jPanel11.setLayout(new java.awt.GridLayout(1, 4));

        checkOperable.setText("Operable");
        checkOperable.setOpaque(false);
        jPanel11.add(checkOperable);

        checkReqMant.setText("Requiere Mantenimiento");
        checkReqMant.setOpaque(false);
        jPanel11.add(checkReqMant);

        checkReqPrep.setText("Requiere Preparación");
        checkReqPrep.setOpaque(false);
        jPanel11.add(checkReqPrep);

        checkDaniado.setText("Dañado");
        checkDaniado.setOpaque(false);
        jPanel11.add(checkDaniado);

        javax.swing.GroupLayout jPanel10Layout = new javax.swing.GroupLayout(jPanel10);
        jPanel10.setLayout(jPanel10Layout);
        jPanel10Layout.setHorizontalGroup(
            jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel10Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jPanel8, javax.swing.GroupLayout.DEFAULT_SIZE, 652, Short.MAX_VALUE)
                    .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, 652, Short.MAX_VALUE)
                    .addComponent(jPanel9, javax.swing.GroupLayout.DEFAULT_SIZE, 652, Short.MAX_VALUE)
                    .addComponent(jPanel11, javax.swing.GroupLayout.DEFAULT_SIZE, 652, Short.MAX_VALUE))
                .addContainerGap())
        );
        jPanel10Layout.setVerticalGroup(
            jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel10Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel9, javax.swing.GroupLayout.PREFERRED_SIZE, 149, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, 122, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel8, javax.swing.GroupLayout.DEFAULT_SIZE, 159, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel11, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pnlContenedor.add(jPanel10, java.awt.BorderLayout.CENTER);

        getContentPane().add(pnlContenedor, java.awt.BorderLayout.CENTER);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void txtClienteSalidaKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtClienteSalidaKeyPressed
// TODO add your handling code here:
        if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
            txtClienteSalida.requestFocusInWindow();
        }
    }//GEN-LAST:event_txtClienteSalidaKeyPressed

    private void txtTranspSalidaKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtTranspSalidaKeyPressed
// TODO add your handling code here:
    }//GEN-LAST:event_txtTranspSalidaKeyPressed

    private void txtLicenciaSalidaKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtLicenciaSalidaKeyPressed
// TODO add your handling code here:
    }//GEN-LAST:event_txtLicenciaSalidaKeyPressed

    private void txtClienteEntradaKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtClienteEntradaKeyPressed
        // TODO add your handling code here:
    }//GEN-LAST:event_txtClienteEntradaKeyPressed

    private void txtTranspEntradaKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtTranspEntradaKeyPressed
        // TODO add your handling code here:
    }//GEN-LAST:event_txtTranspEntradaKeyPressed

    private void txtLicenciaEntradaKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtLicenciaEntradaKeyPressed
        // TODO add your handling code here:
    }//GEN-LAST:event_txtLicenciaEntradaKeyPressed

    private void comboPilotoSalidaItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_comboPilotoSalidaItemStateChanged
        // TODO add your handling code here:
        Pilotos piloto = (Pilotos) this.comboPilotoSalida.getSelectedItem();
        this.txtLicenciaSalida.setText(piloto.getTipoLicencia());
    }//GEN-LAST:event_comboPilotoSalidaItemStateChanged

    private void comboPilotoEntradaItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_comboPilotoEntradaItemStateChanged
        // TODO add your handling code here:
        if (this.comboPilotoEntrada.getSelectedIndex() >= 0) {
            Pilotos pilotoE = (Pilotos) this.comboPilotoEntrada.getSelectedItem();
            this.txtLicenciaEntrada.setText(pilotoE.getTipoLicencia());
        }
    }//GEN-LAST:event_comboPilotoEntradaItemStateChanged

    private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGuardarActionPerformed
// TODO add your handling code here:
        guardarDatos();
    }//GEN-LAST:event_btnGuardarActionPerformed

    public void generarEsquemaMontaje() {
        lienzoSalida.setSize(contenedorSalida.getWidth(), contenedorSalida.getHeight());
        int max_num_llantas_x_eje = 0, num_ejes, pos = 0;
        int esquema[];
        ejes = new ArrayList<EjeES>();
        List<Ejes> sistema_ejes = vehiculo.getIdTipoEje().getEjesList();
        Collections.sort(sistema_ejes);
        num_ejes = sistema_ejes.size();
        esquema = new int[sistema_ejes.size()];
        int cantidadNeumaticos = 0;
        for (Ejes e : sistema_ejes) {
            int num_neumaticos = e.getNumNeumaticos();
            cantidadNeumaticos += num_neumaticos;
            if (num_neumaticos > max_num_llantas_x_eje) {
                max_num_llantas_x_eje = num_neumaticos;
            }
            //ESTABLECEMOS EL NÚMERO DE VEHÍCULOS POR EJE
            esquema[pos++] = num_neumaticos;
        }
        max_num_llantas_x_eje /= 2;
        centro = new Point(lienzoSalida.getWidth() / 2, lienzoSalida.getHeight() / 2);
        img_x = centro.x - imagen.getWidth(this) / 2;
        img_y = centro.y - imagen.getHeight(this) / 2;
        int posicion = cantidadNeumaticos;
        if (tipo_vehiculo == Constantes.SEMIREMOLQUE) {
            int ancho_total = 100;
            int alto_total = 30;
            int ancho_llanta;
            if (num_ejes < 5) {
                ancho_llanta = 25;
            } else {
                ancho_llanta = ancho_total / num_ejes;
            }
            int xi = img_x + 88;
            int yi = img_y;
            int alto_llanta = alto_total / max_num_llantas_x_eje;
            for (int i = 0; i < sistema_ejes.size(); i++) {
                int limite = esquema[i] / 2;
                //Arriba
                int pos_x = xi + ancho_total - (i + 1) * ancho_llanta;
                for (int j = 0; j < limite; j++) {
                    int pos_y = yi + alto_llanta * j;
                    EjeES eje = new EjeES(pos_x, pos_y, ancho_llanta, alto_llanta, posicion--);
                    ejes.add(eje);
                }
                //Abajo
                for (int j = 0, k = 1; j < limite; j++, k++) {
                    int pos_y = yi + imagen.getHeight(this) - alto_llanta * (j + 1);
                    EjeES eje = new EjeES(pos_x, pos_y, ancho_llanta, alto_llanta, posicion - (limite - k));
                    ejes.add(eje);
                }
                posicion -= limite;
            }
            EjeES ejeR1 = new EjeES(10, lienzoSalida.getHeight() - 25, ancho_llanta, alto_llanta, 0);
            EjeES ejeR2 = new EjeES(35, lienzoSalida.getHeight() - 25, ancho_llanta, alto_llanta, -1);
            ejes.add(ejeR1);
            ejes.add(ejeR2);
        } else if (tipo_vehiculo == Constantes.REMOLQUE) {
            int ancho_total = 50;
            int alto_total = 30;
            int ancho_llanta;
            if (num_ejes < 5) {
                ancho_llanta = 25;
            } else {
                ancho_llanta = ancho_total / (num_ejes);
            }
            int xi = img_x + 135;
            int yi = img_y;
            int alto_llanta = alto_total / max_num_llantas_x_eje;
            for (int i = 0; i < sistema_ejes.size() - 1; i++) {
                int limite = esquema[i] / 2;
                //Arriba
                int pos_x = xi + ancho_total - (i + 1) * ancho_llanta;
                for (int j = 0; j < limite; j++) {
                    int pos_y = yi + alto_llanta * j;
                    EjeES eje = new EjeES(pos_x, pos_y, ancho_llanta, alto_llanta, posicion--);
                    ejes.add(eje);
                }
                //Abajo
                for (int j = 0, k = 1; j < limite; j++, k++) {
                    int pos_y = yi + imagen.getHeight(this) - alto_llanta * (j + 1);
                    EjeES eje = new EjeES(pos_x, pos_y, ancho_llanta, alto_llanta, posicion - (limite - k));
                    ejes.add(eje);
                }
                posicion -= limite;
            }
            xi = img_x + 15;
            int limite = esquema[sistema_ejes.size() - 1] / 2;
            //Delanteras derecha
            for (int j = 0; j < limite; j++) {
                int pos_y = yi + alto_llanta * j;
                EjeES eje = new EjeES(xi, pos_y, ancho_llanta, alto_llanta, posicion--);
                ejes.add(eje);
            }
            //Delanteras izquierda
            for (int j = 0, k = 1; j < limite; j++, k++) {
                int pos_y = yi + imagen.getHeight(this) - alto_llanta * (j + 1);
                EjeES eje = new EjeES(xi, pos_y, ancho_llanta, alto_llanta, posicion - (limite - k));
                ejes.add(eje);
            }
            EjeES ejeR1 = new EjeES(8, lienzoSalida.getHeight() - 25, ancho_llanta, alto_llanta, 0);
            EjeES ejeR2 = new EjeES(35, lienzoSalida.getHeight() - 25, ancho_llanta, alto_llanta, -1);
            ejes.add(ejeR1);
            ejes.add(ejeR2);
        } else if (tipo_vehiculo == Constantes.FURGON) {
            int alto_total = 30;
            if (max_num_llantas_x_eje < 2) {
                alto_total = 15;
            }
            int ancho_llanta = 30;
            int alto_llanta = alto_total / max_num_llantas_x_eje;
            int valores[] = null;
            int yi = img_y;
            switch (num_ejes) {
                case 2:
                    valores = new int[]{180, 80};
                    break;
                case 3:
                    valores = new int[]{200, 170, 80};
                    break;
                case 4:
                    valores = new int[]{200, 110, 80};
                    break;
            }
            for (int i = 0; i < sistema_ejes.size(); i++) {
                int limite = esquema[i] / 2;
                //Arriba
                int pos_x = valores[i];
                for (int j = 0; j < limite; j++) {
                    int pos_y = yi + alto_llanta * j + 3;
                    EjeES eje = new EjeES(pos_x, pos_y, ancho_llanta, alto_llanta, posicion--);
                    ejes.add(eje);
                }
                //Abajo
                for (int j = 0, k = 1; j < limite; j++, k++) {
                    int pos_y = yi + imagen.getHeight(this) - alto_llanta * (j + 1) - 3;
                    EjeES eje = new EjeES(pos_x, pos_y, ancho_llanta, alto_llanta, posicion - (limite - k));
                    ejes.add(eje);
                }
                posicion -= limite;
            }
            EjeES ejeR1 = new EjeES(5, lienzoSalida.getHeight() - 25, ancho_llanta, alto_llanta, 0);
            EjeES ejeR2 = new EjeES(38, lienzoSalida.getHeight() - 25, ancho_llanta, alto_llanta, -1);
            ejes.add(ejeR1);
            ejes.add(ejeR2);
        }
        if (!ejes.isEmpty()) {
            llantas_finales = new ArrayList<LlantaES>();
            if (controlActual != null) {
                List<DetalleControlCambioNeumatico> detalles = controlActual.getDetalleControlCambioNeumaticoList();
                for (DetalleControlCambioNeumatico detalle : detalles) {
                    if (detalle.getTipo() == Constantes.MONTAJE || detalle.getTipo() == Constantes.SIN_MOVIMIENTO) {
                        int ubicacion = detalle.getPosicion();
                        for (EjeES eje : ejes) {
                            if (eje.getPosicion() == ubicacion) {
                                LlantaES llanta = new LlantaES(eje, lienzoSalida.getWidth(), lienzoSalida.getHeight());
                                llanta.setOrigen(Constantes.FROM_DB);
                                llantas_finales.add((LlantaES) llanta.clone());
                                break;
                            }
                        }
                    }
                }
            } else if (detalleInspeccionSalida != null) {
                for (DetalleInspeccionEquipo detalle : detalleInspeccionSalida) {
                    int ubicacion = detalle.getPosicion();
                    for (EjeES eje : ejes) {
                        if (eje.getPosicion() == ubicacion) {
                            LlantaES llanta = new LlantaES(eje, lienzoSalida.getWidth(), lienzoSalida.getHeight());
                            llanta.setOrigen(Constantes.FROM_DB);
                            llantas_finales.add((LlantaES) llanta.clone());
                            break;
                        }
                    }
                }
            }
        }
    }

    @Override
    public void mouseClicked(MouseEvent e) {
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        if (e.getSource() == txtComentarioSalida) {
            DialogoIngresoObservacionES dlg = new DialogoIngresoObservacionES(Principal.getInstance(), true, txtComentarioSalida.getText(), es);
            dlg.setVisible(true);
            if (dlg.OPCION == 1) {
                txtComentarioSalida.setText(dlg.getMensaje());
            }
            if (tablaSalida.getCellEditor() != null) {
                tablaSalida.getCellEditor().stopCellEditing();
            }
        } else if (e.getSource() == txtComentarioEntrada) {
            DialogoIngresoObservacionES dlg = new DialogoIngresoObservacionES(Principal.getInstance(), true, txtComentarioEntrada.getText(), true);
            dlg.setVisible(true);
            if (dlg.OPCION == 1) {
                txtComentarioEntrada.setText(dlg.getMensaje());
            }
            if (tablaEntrada.getCellEditor() != null) {
                tablaEntrada.getCellEditor().stopCellEditing();
            }
        }
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

//    @Override
//    public void focusGained(FocusEvent e) {
//        if (e.getSource() == txtComentario) {
//            txtComentario.setBackground(new Color(255, 251, 170));
//            txtComentario.requestFocusInWindow();
//            txtComentario.setEditable(true);
////            txtComentario.selectAll();
//            
//        }
//    }
//
//    @Override
//    public void focusLost(FocusEvent e) {
//    }
    class LienzoModelo extends JPanel {

        @Override
        protected void paintComponent(Graphics g) {
            int width = this.getWidth();
            int height = this.getHeight();
            Graphics2D g2 = (Graphics2D) g;
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2.setColor(Color.white);
            g2.fillRect(0, 0, width, height);

//            g2.setColor(new Color(230, 230, 230));
//            g2.fillRect(0, 0, width, height);
//            g2.setColor(new Color(188, 188, 175));
//            for (int i = 0; i < width; i++) {
//                int k = i * 10;
//                g2.drawLine(k, 0, k, height);
//            }
//            for (int i = 0; i < height; i++) {
//                int k = i * 10;
//                g2.drawLine(0, k, width, k);
//            }
            g2.setColor(Color.black);
            g2.drawImage(imagen, img_x, img_y, this);
            for (EjeES eje : ejes) {
                eje.graficar(g2);
            }
            for (LlantaES llanta : llantas_finales) {
                llanta.graficar(g2);
            }
        }
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnGuardar;
    private javax.swing.JCheckBox checkDaniado;
    private javax.swing.JCheckBox checkOperable;
    private javax.swing.JCheckBox checkReqMant;
    private javax.swing.JCheckBox checkReqPrep;
    private javax.swing.JComboBox comboPilotoEntrada;
    private javax.swing.JComboBox comboPilotoSalida;
    private javax.swing.JPanel contenedorEntrada;
    private javax.swing.JPanel contenedorSalida;
    private com.toedter.calendar.JDateChooser dateFechaEntrada;
    private com.toedter.calendar.JDateChooser dateFechaSalida;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel12;
    private javax.swing.JLabel jLabel20;
    private javax.swing.JLabel jLabel21;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel10;
    private javax.swing.JPanel jPanel11;
    private javax.swing.JPanel jPanel12;
    private javax.swing.JPanel jPanel13;
    private javax.swing.JPanel jPanel14;
    private javax.swing.JPanel jPanel15;
    private javax.swing.JPanel jPanel16;
    private javax.swing.JPanel jPanel19;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel20;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JPanel jPanel5;
    private javax.swing.JPanel jPanel6;
    private javax.swing.JPanel jPanel7;
    private javax.swing.JPanel jPanel8;
    private javax.swing.JPanel jPanel9;
    private javax.swing.JToolBar jToolBar1;
    private javax.swing.JPanel pnlContenedor;
    private javax.swing.JScrollPane scrollBuses2;
    private javax.swing.JScrollPane scrollBuses3;
    private javax.swing.JSpinner spnHoraEntrada;
    private javax.swing.JSpinner spnHoraSalida;
    private javax.swing.JTable tablaEntrada;
    private javax.swing.JTable tablaSalida;
    private javax.swing.JTextField txtClienteEntrada;
    private javax.swing.JTextField txtClienteSalida;
    private javax.swing.JTextField txtId;
    private javax.swing.JTextField txtLicenciaEntrada;
    private javax.swing.JTextField txtLicenciaSalida;
    private javax.swing.JTextField txtTranspEntrada;
    private javax.swing.JTextField txtTranspSalida;
    private javax.swing.JTextField txtVehiculoEntrada;
    private javax.swing.JTextField txtVehiculoSalida;
    // End of variables declaration//GEN-END:variables
}
